package com.chenliwu.demo.collection;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;

/**
 * for循环删除陷阱
 *
 * @author chenliwu
 * @since 2022-01-31
 */
public class for循环删除陷阱 {

    public static void main(String[] args) {
        // testArrayListDeleteInFor();
        testLinkedListDeleteInFor();
    }

    /**
     * ArrayList：在循环当中删除元素，会抛出java.lang.UnsupportedOperationException。
     * 倒数第二个不会抛出异常，其他都抛出异常
     */
    static void testArrayListDeleteInFor() {
        List<String> dataList = new ArrayList<>();
        initDataList(dataList);

        String deleteItem = "c";
        for (String data : dataList) {
            if (Objects.equals(deleteItem, data)) {
                dataList.remove(data);
            }
        }
        System.out.println("剩余元素个数：" + dataList.size());
    }

    static void initDataList(List<String> dataList) {
        dataList.add("a");
        dataList.add("b");
        dataList.add("c");
        dataList.add("d");
        dataList.add("e");
    }

    /**
     * LinkedList：在循环当中删除元素，会抛出java.lang.ConcurrentModificationException。
     * <p>
     * 倒数两个删除不会抛出异常，其他都抛出异常
     */
    static void testLinkedListDeleteInFor() {
        List<String> dataList = new LinkedList<>();
        initDataList(dataList);

        String deleteItem = "c";
        for (String data : dataList) {
            if (Objects.equals(deleteItem, data)) {
                dataList.remove(data);
            }
        }
        System.out.println("剩余元素个数：" + dataList.size());
    }

}
